extends Node2D
@onready var tile_map_layer: TileMapLayer = $TileMapLayer
var TileSetNumber = 0;
var TileRoad = Vector2i(0, 19);
@onready var player: CharacterBody2D = $邮车;
var tile_length = 710.0;  # 基础间隔（710）
var last_trigger_x = 0.0;  # 上次触发生成的玩家X坐标
var initial_setup_done = false;  # 标记是否完成初始化
@onready var target_area: Area2D = $检查点
var area_spawn_chance = 0.4;  # 生成Area2D的概率（50%）
var spawn_offset = 1700.0;  # 玩家前方生成距离
var target_area_max = 10;  # 最大生成数量（可按需修改）
var current_area_count = 0;  # 当前已生成的数量计数器
@onready var final_area: Area2D = $终点
var final_area_spawned = false
@onready var goal_count: Label = $邮车/Camera2D/关卡目标
var count=0;

func _ready() -> void:
	print("脚本载入成功");

	last_trigger_x = player.position.x;
	# 初始化生成7个瓦片
	generate_road_tiles();
	initial_setup_done = true;
	pass;

# 核心函数：生成7个瓦片+ 清除旧瓦片
func generate_road_tiles() -> void:
	# 1. 清除所有旧瓦片（避免堆积）
	tile_map_layer.clear();
	#print("已清除所有旧瓦片");
	
	# 2. 获取玩家当前世界坐标（作为基准位置）
	var player_world_pos = player.global_position;
	
	# 3. 瓦片X轴偏移量（关键修改！新增 tile_length*3 和 tile_length*4，且放在数组末尾表示最前方）
	# 说明：offset_x 越大，瓦片越靠玩家前方；负数是玩家后方
	var offsets = [
		-tile_length*2,  # 玩家后方1420（原）
		-tile_length,    # 玩家后方710（原）
		0.0,             # 玩家当前位置（原）
		tile_length,     # 玩家前方710（原）
		tile_length*2,   # 玩家前方1420（原）
		tile_length*3,   # 新增：玩家前方2130（更靠前）
		tile_length*4    # 新增：玩家前方2840（最靠前）
	];
	
	# 4. 逐个生成瓦片（世界坐标→网格坐标→生成）
	for offset_x in offsets:
		# 计算当前瓦片的世界坐标
		var target_world_pos = player_world_pos + Vector2(offset_x, 0);
		# 转换为瓦片网格坐标（Godot 4.x 标准流程）
		var tile_pos = world_to_tile_grid(target_world_pos);
		# 生成瓦片
		tile_map_layer.set_cell(tile_pos, TileSetNumber, TileRoad);
		# 可选：打印日志验证新增瓦片位置
		# print("生成瓦片：世界坐标（", target_world_pos.x, "）→ 网格坐标（", tile_pos, "）");
	pass;

# 辅助函数：世界坐标 → 瓦片网格坐标（统一转换逻辑）
func world_to_tile_grid(world_pos: Vector2) -> Vector2i:
	var local_pos = tile_map_layer.to_local(world_pos);  # 世界→局部
	var grid_pos = tile_map_layer.local_to_map(local_pos);  # 局部→网格
	grid_pos.y = 0;  # 固定Y轴网格坐标（按你的马路高度调整）
	return grid_pos;

func _process(delta: float) -> void:
	# 初始化完成后，才检测移动触发
	if not initial_setup_done:
		return;
	
	# 玩家每向右移动710单位，触发一次（仅正向移动）
	if player.position.x - last_trigger_x >= tile_length:
		# 生成新的7个瓦片（自动清除旧瓦片）
		generate_road_tiles();
		# 更新上次触发坐标（累计叠加，支持持续触发）
		last_trigger_x += tile_length;
		#print("玩家移动710单位，已更新瓦片组");
		try_duplicate_area();
	pass;

# 新功能：复制Area2D到玩家前方1000单位
func try_duplicate_area() -> void:
	# 检查模板Area2D是否存在
	if not target_area:
		print("警告：未找到作为模板的Area2D节点，请检查节点名称");
		return;
	
	# 情况1：未达上限，正常生成target_area
	if current_area_count < target_area_max:
		# 40%概率触发复制
		if randf() < area_spawn_chance:
			# 1. 复制模板节点（深度复制，包含子节点如碰撞体）
			var new_area = target_area.duplicate();
			# 2. 设置新节点的名称（避免重复）
			new_area.name = "Area2D_Spawned_" + str(randi_range(1000, 9999));  # 随机后缀
			# 3. 计算目标位置：玩家当前X+spawn_offset，Y与玩家一致
			var target_pos = Vector2(
				player.global_position.x + spawn_offset,
				player.global_position.y  # 保持在道路同一高度
			);
			# 4. 设置新Area2D的世界位置
			new_area.global_position = target_pos;
			# 5. 显示新节点
			new_area.visible = true;
			# 6. 将新节点添加到当前节点下（与模板同级）
			add_child(new_area);
			
			current_area_count += 1;
			print("成功复制检查点！位置：", target_pos, " 节点名称：", new_area.name, 
				  " 当前数量：", current_area_count);
			# 3秒后自动删除该Area2D
			new_area.call_deferred("queue_free_in", 3.0);
		else:
			# 概率未触发时不操作
			pass;
	
	# 情况2：已达上限，且final_area未生成过 → 生成final_area
	elif current_area_count >= target_area_max and not final_area_spawned:
		# 检查final_area模板是否存在
		if not final_area:
			print("警告：未找到作为模板的final_area节点，请检查节点名称");
			return;
		
		# 1. 复制final_area节点（深度复制）
		var new_final_area = final_area.duplicate();
		# 2. 设置新节点名称（避免重复）
		new_final_area.name = "FinalArea_Spawned";
		# 3. 计算目标位置：玩家当前X+spawn_offset，Y与玩家一致
		var final_target_pos = Vector2(
			player.global_position.x + spawn_offset,
			player.global_position.y
		);
		# 4. 设置位置并显示
		new_final_area.global_position = final_target_pos;
		new_final_area.visible = true;
		# 5. 添加到当前节点下
		add_child(new_final_area);
		
		# 标记为已生成（避免重复生成）
		final_area_spawned = true;
		print("✅ 检查点已达生成上限（", target_area_max, "个），生成终点节点！位置：", final_target_pos);
	
	# 情况3：已达上限且final_area已生成 → 不操作
	else:
		print("已达检查点生成上限，且终点已生成，停止生成");
	pass;

# 扩展函数：延迟删除节点（避免立即删除导致的逻辑问题）
func queue_free_in(delay: float) -> void:
	await get_tree().create_timer(delay).timeout;
	queue_free();
	print("自动清理Area2D：", name);
